/*******************************************************************************
 * Copyright (c) 2022, 2022
 ******************************************************************************/
package com.alex.demo.rabbitmq.config;

import java.util.HashMap;
import java.util.Map;

import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @Version 1.0
 * @Author Alex
 * @Created Dec 2022/9/26 11:15
 * @Description
 *              <p>
 *              延迟队列的配置
 */
@Configuration
public class TTLQueueConfig {

	// 普通交换机名称
	public static final String X_EXCHANGE = "X";

	// 死信交换机名称
	public static final String Y_DEAD_LETTER_EXCHANGE = "Y";

	// 普通队列名称
	public static final String QUEUE_A = "QA";

	public static final String QUEUE_B = "QB";

	// 死信队列名称
	public static final String DEAD_LETTER_QUEUE = "QD";

	// 普通队列名称
	public static final String QUEUE_C = "QC";

	// 声明普通交换机
	@Bean("xExchange")
	public DirectExchange xExchange() {
		return new DirectExchange(X_EXCHANGE);
	}

	// 声明死信交换机
	@Bean("yExchange")
	public DirectExchange yExchange() {
		return new DirectExchange(Y_DEAD_LETTER_EXCHANGE);
	}

	// 声明普通队列，并设定过期时间TTL 10s
	@Bean("queueA")
	public Queue queueA() {
		Map<String, Object> arguments = new HashMap<>(3);
		// 设置死信交换机
		arguments.put("x-dead-letter.exchange", Y_DEAD_LETTER_EXCHANGE);
		// 设置死信RoutingKey
		arguments.put("x-dead-letter.routing-key", "YD");
		// 设置TTL 单位ms
		arguments.put("x-message-ttl", 10000);
		return QueueBuilder.durable(QUEUE_A).withArguments(arguments).build();
	}

	// 声明普通队列，并设定过期时间TTL 40s
	@Bean("queueB")
	public Queue queueB() {
		Map<String, Object> arguments = new HashMap<>(3);
		// 设置死信交换机
		arguments.put("x-dead-letter.exchange", Y_DEAD_LETTER_EXCHANGE);
		// 设置死信RoutingKey
		arguments.put("x-dead-letter.routing-key", "YD");
		// 设置TTL 单位ms
		arguments.put("x-message-ttl", 40000);
		return QueueBuilder.durable(QUEUE_B).withArguments(arguments).build();
	}

	// 声明死信队列
	@Bean("queueD")
	public Queue queueD() {
		return QueueBuilder.durable(DEAD_LETTER_QUEUE).build();
	}

	// 声明QC
	@Bean("queueC")
	public Queue queueC() {
		Map<String, Object> arguments = new HashMap<>(3);
		// 设置死信交换机
		arguments.put("x-dead-letter.exchange", Y_DEAD_LETTER_EXCHANGE);
		// 设置死信RoutingKey
		arguments.put("x-dead-letter.routing-key", "YD");
		// 注意本队列不设置TTL时间，而是有生产者在发送的时候指定TTL ，这样该队列就可以用来适配任何TTL时间的消息
		return QueueBuilder.durable(QUEUE_C).withArguments(arguments).build();
	}

	// 绑定
	@Bean
	public Binding queueABindingX(@Qualifier("queueA") Queue queueA, @Qualifier("xExchange") DirectExchange xExchange) {
		return BindingBuilder.bind(queueA).to(xExchange).with("XA");
	}

	@Bean
	public Binding queueBBindingX(@Qualifier("queueB") Queue queueB, @Qualifier("xExchange") DirectExchange xExchange) {
		return BindingBuilder.bind(queueB).to(xExchange).with("XB");
	}

	@Bean
	public Binding queueDBindingY(@Qualifier("queueD") Queue queueD, @Qualifier("yExchange") DirectExchange yExchange) {
		return BindingBuilder.bind(queueD).to(yExchange).with("YD");
	}

	@Bean
	public Binding queueCBindingX(@Qualifier("queueC") Queue queueC, @Qualifier("xExchange") DirectExchange xExchange) {
		return BindingBuilder.bind(queueC).to(xExchange).with("XC");
	}
}
